oddwarg();

About

Games

Stuff

Music

Affiliates


OVO Vector Object

OVO is a primitive file format for vector-based geometry, typically 3D meshes.

Downloads

Specification document (Version 1, 2021.04.24)

Sample implementation of a parser (java)

Import/Export plugin for Blender 2.79 (2024.07.24)

Import/Export plugin for Blender 2.8+ (2023.06.20, unmaintained)

(If you want to use this for modern Blender you will have to repair the plugin as they introduce breaking changes every update, I do not maintain it as I have no reasons to depart from 2.79.)

Example

This example OVO format file defines a flat rectangle spanning from -1 to 1 on the x and y axes. All vertices have a normal pointing in the +z direction. The vertices have texture coordinates spanning from 0 to 1, in such a way that it would paint a whole texture in its natural orientation. The vertices are assembled into a rectangle consisting of two triangles. Note this example has no vertex groups (e.g. for skinning) and no primitive groups (e.g. for materials). Their omission is valid, but they would typically be present.
    METADATA 1
     ovo_version:1
    
    VERTICES [v:2 n:3 t0:2] 4
     -1 -1   0 0 1   0 0
      1 -1   0 0 1   1 0
     -1  1   0 0 1   0 1
      1  1   0 0 1   1 1
    
    PRIMITIVE_LISTS 1
     TRIANGLES 6
      0 1 2
      2 1 3

Features

  • Structurally compatible with low level 3D graphics libraries. OVO files consist of vertex buffers and index buffers paired with appropriate metadata.
  • The format supports custom vertex attributes or primitive types if the suggested ones are insufficient.
  • Vertices can have n-to-m weighted relationships to vertex groups, designed for skinning, but you can use this to annotate vertices however you want.
  • Primitive lists can have n-to-m relationships with primitive groups, designed for material support, but you can use this to annotate primitives however you want.
  • Plaintext. You can read the files or do simple edits in a text editor. Revision control diffs will be readable.
  • Easy to parse. No parsing library is necessary to write an implementation, just basic string and array functions available in any programming language. A feature complete parser is achieved in a few hundred lines of code.
  • OVO files contain geometry only. The metadata features can be used to link to external material and animation files, but you are free to decide if or how you do this.

Motivation

Most 3D model formats are very complicated and pack many types of objects into the same file, often embedding materials, shaders, textures, armatures, animation frame data, and, in some cases, entire scenegraphs. This makes them difficult and uncomfortable to use for programmers developing their own engines:

  • Big formats inevitably contain many assumptions about the structure of the program and its data, often conflicting with your vision as the developer.
  • It is very difficult to gain a complete understanding of these formats, creating unnecessary barriers to debugging.
  • Packing many objects into a single file is a poor choice for, for instance, revision control. Commits become larger than necessary, and it becomes difficult to tell at a glance which objects were changed when looking at the logs.
  • It is extremely difficult to write a complete implementation of any sort of processor for these formats. This encourages writing incomplete implementations, or depending on (often comically large) libraries with many features you don't need, bloating your project, importing the library's bugs, and tying your project to the library's update cycle.

On the other hand, the available simple 3D model formats are typically just a bad match for how 21st century 3D graphics actually work, and lack support for essential features like weighted vertex groups, multiple UV maps, vertex colours, etc.

My first attempt at resolving these issues consisted of extending the Wavefront OBJ format to support weighted vertex groups and some ad-hoc annotations (Blender plugin). However, I still lacked support for additional vertex attributes. Furthermore, the fact is OBJ has an antiquated structure that requires substantial processing to be converted into a form suitable for rendering today.

The OVO format is a compact solution to these issues.

OwO